package evemanutool.gui.general.components;
import java.awt.Color;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.text.DecimalFormat;
import javax.swing.JTextField;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
@SuppressWarnings("serial")
public class NumberField extends JTextField {
//Constants.
private static final Color ERR_BACKGROUND = Color.YELLOW;
private Color background;
//Limits
double min;
double max;
boolean allowDecimal;
int maxChars;
DecimalFormat df2;
public NumberField(double value, boolean allowDecimal, double min, double max, int maxChars) {
background = getBackground();
this.min = min;
this.max = max;
this.allowDecimal = allowDecimal;
this.maxChars = maxChars - 1;
//Format as decimal or int.
if (allowDecimal) {
setText(value + "");
}else {
setText((int) value + "");
}
//Limit the number of characters.
addKeyListener(new CharListener());
//Set tooltip.
if (allowDecimal) {
setToolTipText("Allowed range is: " + min + " - " + max);
}else {
//Adjust to be inclusive.
setToolTipText("Allowed range is: " + (min + 1) + " - " + (max - 1));
}
//Set width.
setColumns(maxChars);
//Set listener.
getDocument().addDocumentListener(new TextListener());
}
public void setValue(double value) {
if (allowDecimal) {
setText(value + "");
}else {
setText((int) value + "");
}
}
public boolean isValidInput() {
String s = getText();
double d;
try {
if (allowDecimal) {
d = Double.parseDouble(s);
}else {
d = Integer.parseInt(s);
}
if (min < d && max > d) {
return true;
}
} catch (Exception e) {
}
return false;
}
public double getValue() {
try {
return Double.parseDouble(getText());
} catch (Exception e) {
}
return 0;
}
private void updateBackground() {
if (isValidInput()) {
setBackground(background);
}else {
setBackground(ERR_BACKGROUND);
}
}
private class TextListener implements DocumentListener {
@Override
public void changedUpdate(DocumentEvent e) {}
@Override
public void insertUpdate(DocumentEvent e) {
updateBackground();
}
@Override
public void removeUpdate(DocumentEvent e) {
updateBackground();
}
}
private class CharListener implements KeyListener {
@Override
public void keyPressed(KeyEvent e) {
if(getText().length() > maxChars) {
setText(getText().substring(0, maxChars));
}
}
@Override
public void keyReleased(KeyEvent e) {}
@Override
public void keyTyped(KeyEvent e) {}
}
}